// 封装 axios
import axios from 'axios'
import store from '@/store'
import { Toast } from 'antd-mobile'
import { customHistory } from './history'

const http = axios.create({
  // 接口的基础路径
  // baseURL: 'http://toutiao.itheima.net/v1_0',
  baseURL: 'http://geek.itheima.net/v1_0',
  timeout: 5000,
})

// 使用 拦截器 后，请求的执行过程：
//
// 1 http.get() => 2 请求拦截器
//    ===> 浏览器将请求发送，服务器接收到请求 ===> 服务器处理并响应请求
//    => 3 响应拦截器 => 4 拿到本次请求的结果（const res = await http.get()）

// 请求拦截器
http.interceptors.request.use(config => {
  const {
    login: { token },
  } = store.getState()

  // 除了登录请求外，其他请求统一添加 token
  if (!config.url?.startsWith('/authorizations') && config.headers) {
    config.headers.Authorization = `Bearer ${token}`
  }

  // http://xxx.com/authorizations?redirect=/home
  // if (!config.url?.startsWith('/authorizations')) {
  //   // 此处，需要使用 非空断言（TS类型） 来去掉 headers 类型中的 undefined 类型
  //   config.headers!.Authorization = `Bearer ${token}`

  //   // ! 是 tS 中的类型，叫做：非空断言，用来从类型中去掉 null 或 undefined
  //   // const headers = config.headers!
  //   // headers.Authorization = `Bearer ${token}`

  //   // 如果使用了 ?. 那么，这个 表达式 不能出现在 等号 左边
  //   // const a = config.headers?.Authorization
  //   // config.headers?.Authorization = `Bearer ${token}`
  // }

  return config
})

// 响应拦截器
http.interceptors.response.use(undefined, error => {
  // 响应失败时，会执行此处的回调函数

  if (!error.response) {
    // 网路超时
    Toast.show({
      content: '网络繁忙，请稍后再试',
      duration: 1000,
    })
    return Promise.reject(error)
  }

  if (error.response.status === 401) {
    // token 过期，登录超时
    Toast.show({
      content: '登录超时，请重新登录',
      duration: 1000,
      afterClose: () => {
        // push 方法的第二个参数，就是在路由跳转时携带的额外数据
        customHistory.push('/login', {
          from: customHistory.location.pathname,
        })
      },
    })
  }

  return Promise.reject(error)
})

export { http }
